package com.bicon.botu.account.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.bicon.botu.account.common.AccountConstants;
import com.bicon.botu.account.entity.AccountRole;
import com.bicon.botu.account.entity.Role;
import com.bicon.botu.account.entity.RoleResources;
import com.bicon.botu.account.mapper.RoleMapper;
import com.bicon.botu.account.service.IRoleService;
import com.bicon.botu.core.base.common.Constants;
import com.bicon.botu.core.base.common.entity.BaseResult;
import com.bicon.botu.core.base.repository.redis.RedisHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @auther 裴志鹏
 * @date 2017/11/30 11:34
 */
@Slf4j
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {

    @Autowired
    private RedisHandler redisHandler;

    /**
     * 新增角色
     *
     * @param name 角色名
     * @param code 角色code
     * @param type 账户类型：0：前台账户，1：后台账户
     * @return
     */
    @Override
    public boolean add(String name, String code, String type) {
        Role role = new Role();
        role.setCode(code);
        role.setName(name);
        role.setType(type);
        role.preInsert();
        return role.insert();
    }

    /**
     * 删除角色
     *
     * @param roleId 角色id
     * @param type   账户类型：0：前台账户，1：后台账户
     * @return
     */
    @Override
    public BaseResult delete(String roleId, String type) {
        Role role = new Role();
        role.preUpdate();
        role.setId(roleId);
        role.setType(type);
        role.setLogicDelete(Constants.DEL_LOGIC_DELETE);
        boolean result = role.updateById();
        if (result) {
//          删除账号角色关联信息
            List<AccountRole> accountRoles = new AccountRole().selectList(new EntityWrapper<AccountRole>().eq("role_id", roleId).eq("type", type).eq("logic_delete", Constants.DEL_LOGIC_NORMAL));
            if (!accountRoles.isEmpty() && accountRoles.size() > 0) {
                for (AccountRole accountRole : accountRoles) {
                    redisHandler.getGlobalRedisTemplate().remove(AccountConstants.ACCOUNT_ROLE, accountRole.getAccountId());
                    accountRole.preUpdate();
                    accountRole.setLogicDelete(Constants.DEL_LOGIC_DELETE);
                    accountRole.updateById();
                }
            }
//          删除角色资源关联信息
            List<RoleResources> roleResourcesList = new RoleResources().selectList(new EntityWrapper<RoleResources>().eq("role_id", roleId).eq("type", type).eq("logic_delete", Constants.DEL_LOGIC_NORMAL));
            if (!roleResourcesList.isEmpty() && roleResourcesList.size() > 0) {
                for (RoleResources roleResources : roleResourcesList) {
                    redisHandler.getGlobalRedisTemplate().remove(AccountConstants.ROLE_RESOURCES, roleResources.getRoleId());
                    roleResources.preUpdate();
                    roleResources.setLogicDelete(Constants.DEL_LOGIC_DELETE);
                    roleResources.updateById();
                }
            }
            log.info("delete role success");
            return new BaseResult(Constants.RESPONSE_CODE_200, Constants.RESPONSE_MESSAGE_200);
        } else {
            log.info("delete role fail");
            return new BaseResult(Constants.RESPONSE_CODE_602, Constants.RESPONSE_MESSAGE_602);
        }
    }

    /**
     * 修改角色
     *
     * @param id   角色id
     * @param name 角色名
     * @param code 角色code
     * @param type 账户类型：0：前台账户，1：后台账户
     * @return
     */
    @Override
    public BaseResult update(String id, String name, String code, String type) {
        Role role = new Role();
        role.preUpdate();
        role.setId(id);
        role.setType(type);
        role.setCode(code);
        role.setName(name);
        boolean result = role.updateById();
        if (result) {
            log.info("role update success");
            return new BaseResult(Constants.RESPONSE_CODE_200, Constants.RESPONSE_MESSAGE_200);
        } else {
            log.info("role update fail");
            return new BaseResult(Constants.RESPONSE_CODE_602, Constants.RESPONSE_MESSAGE_602);
        }
    }

    /**
     * 分页查询角色
     *
     * @param pageNo   页码
     * @param pageSize 每页数量
     * @param type     账户类型：0：前台账户，1：后台账户
     * @return
     */
    @Override
    public Page<Role> selectRoleByPageNoAndPageSizeAndType(int pageNo, int pageSize, String type) {
        Page<Role> pages = new Role().selectPage(new Page<>(pageNo, pageSize), new EntityWrapper<Role>().eq("type", type).eq("logic_delete", Constants.DEL_LOGIC_NORMAL).orderBy("create_date", true));
        return pages;
    }


    /**
     * 获取所有的角色
     *
     * @param type 账户类型：0：前台账户，1：后台账户
     * @return
     */
    @Override
    public BaseResult findAllForController(String type) {

        List<Role> list = new Role().selectList(new EntityWrapper<Role>().eq("type", type).eq("logic_delete", Constants.DEL_LOGIC_NORMAL));
        if (list != null) {
            return new BaseResult(Constants.RESPONSE_CODE_200, Constants.RESPONSE_MESSAGE_200, list);
        } else {
            log.info("find RoleAll fail");
            return new BaseResult(Constants.RESPONSE_CODE_602, Constants.RESPONSE_MESSAGE_602);
        }
    }
}
